home *** CD-ROM | disk | FTP | other *** search
/ Mission 3 / Mission 3.zip / Mission 3.iso / tools / windgem6 / vers15 / gemhelp.c < prev    next >
C/C++ Source or Header  |  1996-12-27  |  5KB  |  194 lines

  1. /*************************************************************************
  2.  *  GemHelp.C : Fonctions de gestion de l'aide en ligne.                 *
  3.  *************************************************************************/
  4.  
  5. #include "WindGem.h"
  6. #include "winproto.h"
  7. #include <xgemfast.h>
  8. #include <vaproto.h>
  9.  
  10. /*-=< Inclusion des descriptions des objets UserDefs. >=-----------------*/
  11. #include "user.h"
  12.  
  13. /* Calcul de la position en X de l'objet */
  14. static int CoefX (OBJECT *form, int objet)
  15. {
  16.     register int pere;
  17.     
  18.     if (objet > 0)
  19.     {
  20.         pere = parent (form, objet);
  21.         return form[objet].ob_x + CoefX(form, pere);
  22.     }
  23.     else
  24.         return form[ROOT].ob_x;
  25. }
  26.  
  27. /* Calcul de la position en Y de l'objet */
  28. static int CoefY (OBJECT *form, int objet)
  29. {
  30.     register int pere;
  31.     
  32.     if (objet > 0)
  33.     {
  34.         pere = parent (form, objet);
  35.         return form[objet].ob_y + CoefY(form, pere);
  36.     }
  37.     else
  38.         return form[ROOT].ob_y;
  39. }
  40.  
  41. /* Affichage d'un message d'aide */
  42. void AfficheAide (Wind *wind, int objet)
  43. {
  44.     int x, y, w, h, xm, ym, dummy, xmouse, ymouse, i = 0, j = 0, num = 0, maxlen = 0;
  45.     WindForm *ptr_dial    = wind->cont.dialog;
  46.     MFDB image;
  47.     AIDE *aide;
  48.     char text[3][41];
  49.     
  50.     if (objet > 0)
  51.     {
  52.         aide = ptr_dial->aide;
  53.  
  54.         while  (aide && aide->numObj != objet)
  55.             aide = aide->suiv;
  56.             
  57.         if (aide != (AIDE *)NULL)
  58.         {        
  59.             text[0][0] = '\0';
  60.             text[1][0] = '\0';
  61.             text[2][0] = '\0';
  62.  
  63.             while (aide->txt[i] != '\0' && num <= 2)
  64.             {
  65.                 if (aide->txt[i] == '|')
  66.                 {
  67.                     text[num++][j] = '\0';
  68.                     if (j > maxlen)
  69.                         maxlen = j;
  70.                     j = 0;
  71.                 }
  72.                 else
  73.                     text[num][j++] = aide->txt[i];
  74.  
  75.                 i++;
  76.             }
  77.             if (num <= 2)
  78.                 text[num][j++] = '\0';
  79.             else
  80.                 num--;
  81.                 
  82.             if (Sys->Yres < 399)
  83.             {
  84.                 Sys->AdrAide[HLPTXT1].ob_y = 8;
  85.                 Sys->AdrAide[HLPTXT2].ob_y = 16;
  86.                 Sys->AdrAide[HLPTXT3].ob_y = 24;
  87.             }
  88.             if (Sys->Nplane < 4)
  89.                 Sys->AdrAide[ROOT].ob_spec.obspec.fillpattern = 0;
  90.             
  91.             set_text (Sys->AdrAide, HLPTXT1, text[0]);
  92.             set_text (Sys->AdrAide, HLPTXT2, text[1]);
  93.             set_text (Sys->AdrAide, HLPTXT3, text[2]);
  94.  
  95.             (Sys->AdrAide)->ob_x = CoefX(ptr_dial->adr_form, objet);
  96.             (Sys->AdrAide)->ob_y = CoefY(ptr_dial->adr_form, objet);
  97.             (Sys->AdrAide)->ob_width = (maxlen + 1) * 6;
  98.             (Sys->AdrAide)->ob_height = (num + 1) * 12;
  99.  
  100.             if ((Sys->AdrAide)->ob_x + (Sys->AdrAide)->ob_width > Sys->Xdesk + Sys->Wdesk - 5)
  101.                 (Sys->AdrAide)->ob_x = Sys->Wdesk + Sys->Xdesk - (Sys->AdrAide)->ob_width - 5;
  102.             if ((Sys->AdrAide)->ob_x < Sys->Xdesk + 5)
  103.                 (Sys->AdrAide)->ob_x = Sys->Xdesk + 5;
  104.             if ((Sys->AdrAide)->ob_y + (Sys->AdrAide)->ob_height > Sys->Ydesk + Sys->Hdesk - 5)
  105.                 (Sys->AdrAide)->ob_y = Sys->Hdesk + Sys->Ydesk - (Sys->AdrAide)->ob_height - 5;
  106.             if ((Sys->AdrAide)->ob_y < Sys->Ydesk + 5)
  107.                 (Sys->AdrAide)->ob_y = Sys->Ydesk + 5;
  108.             
  109.             x = (Sys->AdrAide)->ob_x;
  110.             y = (Sys->AdrAide)->ob_y;
  111.             w = (Sys->AdrAide)->ob_width;
  112.             h = (Sys->AdrAide)->ob_height;
  113.  
  114.             get_bkgr (x, y, w, h, &image);    /* Copier l'image de fond */
  115.             objc_draw (Sys->AdrAide, ROOT, MAX_DEPTH, x, y, w, h);
  116.       
  117.             /* Sauver coordonnées de la souris */
  118.             v_hide_c (Sys->VdiHandle);                                            /* Virer la souris */
  119.             graf_mkstate (&xmouse, &ymouse, &dummy, &dummy);
  120.             do    /* BOUCLE PRINCIPALE DE GESTION DU POP-UP */
  121.             {
  122.                 graf_mkstate (&xm, &ym, &dummy, &dummy);        
  123.             } while (xm == xmouse && ym == ymouse);
  124.             put_bkgr (x, y, w, h, &image);    /* Restaurer l'image de fond */
  125.             v_show_c (Sys->VdiHandle, TRUE);                                /* Remet la souris */
  126.     }
  127.     }
  128. }
  129.  
  130. /* Ajout d'un message d'aide */
  131. void AjouteAide (int arbre, int objet, char *txt)
  132. {
  133.     Wind *wind;
  134.     WindForm *ptr_dial;
  135.     AIDE *nouvelle;
  136.     register AIDE *pos;
  137.     
  138.     wind = ObjListe(arbre);
  139.     if (wind != WIND_NULL)
  140.     {
  141.         ptr_dial = wind->cont.dialog;
  142.         nouvelle = (AIDE *)malloc(sizeof(AIDE));
  143.         if (nouvelle)
  144.         {
  145.             nouvelle->numObj = objet;
  146.             nouvelle->txt = (char *) malloc(strlen(txt)+1);
  147.             if (nouvelle->txt)
  148.             {
  149.                 strcpy (nouvelle->txt, txt);
  150.                 nouvelle->suiv = (AIDE *)NULL;
  151.                 pos = ptr_dial->aide;
  152.                 if (pos == (AIDE *)NULL)
  153.                     ptr_dial->aide = nouvelle;
  154.                 else
  155.                 {
  156.                     while (pos->suiv != (AIDE *)NULL)
  157.                         pos = pos->suiv;
  158.  
  159.                     pos->suiv = nouvelle;
  160.                 }
  161.             }
  162.             else
  163.               free(nouvelle);
  164.         }        
  165.     }
  166. }
  167.  
  168. /*-----------------------------------------------------------------------*
  169.  * StGuide - Fonction de gestion d'une aide en ligne au format ST-Guide  *
  170.  *                                                                       *
  171.  * Entrée : Chemin + nom du fichier d'aide                               *
  172.  *          Node St-Guide auquel il faut accéder directement             *
  173.  *-----------------------------------------------------------------------*/
  174. void StGuide(char *fichierHyp, char *node)
  175. {
  176.     int msg[8], i;
  177.   char HelpString[100];
  178.  
  179.   if ((i=appl_find("ST-GUIDE"))>=0)
  180.   {
  181.       msg[0] = VA_START;
  182.     msg[1] = global[2];
  183.     msg[2] = 0;
  184.     sprintf(HelpString, "%s%s %s", AppPath, fichierHyp, node);
  185.     *(char **)&msg[3] = HelpString;
  186.     msg[5] = 0;
  187.     msg[6] = 0;
  188.     msg[7] = 0;
  189.     appl_write(i, 16, msg);
  190.     }
  191. }
  192.  
  193. /**************************-=< Fin du module >=-**************************/
  194.